﻿2026-05-17T04:45:17.9796183Z ##[group]Run pnpm verify:phase-5
2026-05-17T04:45:17.9796532Z [36;1mpnpm verify:phase-5[0m
2026-05-17T04:45:17.9832075Z shell: /usr/bin/bash -e {0}
2026-05-17T04:45:17.9832352Z env:
2026-05-17T04:45:17.9832576Z   SKIP_STAGING_VERIFY: false
2026-05-17T04:45:17.9832849Z   SKIP_PHASE_4_CARRYOVER: 
2026-05-17T04:45:17.9833111Z   SKIP_STAGING_SMOKE: false
2026-05-17T04:45:17.9833436Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-17T04:45:17.9833779Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-17T04:45:17.9834328Z   SKIP_TRACE_CHECK: 1
2026-05-17T04:45:17.9834566Z ##[endgroup]
2026-05-17T04:45:18.2695244Z 
2026-05-17T04:45:18.2696368Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-17T04:45:18.2697439Z > node scripts/verify-phase-5.mjs
2026-05-17T04:45:18.2697947Z 
2026-05-17T04:45:18.3018722Z 
2026-05-17T04:45:18.3019593Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-17T04:45:18.3020468Z >>> pnpm verify:phase-4
2026-05-17T04:45:18.6244722Z 
2026-05-17T04:45:18.6245813Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-17T04:45:18.6246983Z > node scripts/verify-phase-4.mjs
2026-05-17T04:45:18.6247557Z 
2026-05-17T04:45:18.6574303Z 
2026-05-17T04:45:18.6574998Z === Workspace: typecheck ===
2026-05-17T04:45:18.6577831Z >>> pnpm -r typecheck
2026-05-17T04:45:18.9536945Z Scope: 5 of 6 workspace projects
2026-05-17T04:45:18.9587867Z packages/db typecheck$ tsc --noEmit
2026-05-17T04:45:18.9596440Z packages/game-logic typecheck$ tsc --noEmit
2026-05-17T04:45:21.5043360Z packages/game-logic typecheck: Done
2026-05-17T04:45:21.5144567Z packages/protocol typecheck$ tsc --noEmit
2026-05-17T04:45:23.4868570Z packages/db typecheck: Done
2026-05-17T04:45:24.9811842Z packages/protocol typecheck: Done
2026-05-17T04:45:24.9820533Z apps/client typecheck$ tsc --noEmit
2026-05-17T04:45:24.9824683Z apps/server typecheck$ tsc --noEmit
2026-05-17T04:45:36.8204556Z apps/client typecheck: Done
2026-05-17T04:45:37.5191228Z apps/server typecheck: Done
2026-05-17T04:45:37.5296988Z 
2026-05-17T04:45:37.5297633Z === Lint: protocol-sync ===
2026-05-17T04:45:37.5298299Z >>> pnpm lint:protocol-sync
2026-05-17T04:45:37.8250899Z 
2026-05-17T04:45:37.8252067Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-17T04:45:37.8253370Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-17T04:45:37.8254214Z 
2026-05-17T04:45:37.8552060Z lint-protocol-sync: OK
2026-05-17T04:45:37.8677427Z 
2026-05-17T04:45:37.8678148Z === Lint: game-logic-purity ===
2026-05-17T04:45:37.8678956Z >>> pnpm lint:game-logic-purity
2026-05-17T04:45:38.1551868Z 
2026-05-17T04:45:38.1553113Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-17T04:45:38.1554519Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-17T04:45:38.1555238Z 
2026-05-17T04:45:38.1870772Z lint-game-logic-purity: OK (8 file(s) clean)
2026-05-17T04:45:38.1993090Z 
2026-05-17T04:45:38.1993762Z === Lint: better-auth-schema-sync ===
2026-05-17T04:45:38.1994872Z >>> pnpm lint:better-auth-schema-sync
2026-05-17T04:45:38.4865154Z 
2026-05-17T04:45:38.4866354Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-17T04:45:38.4867686Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-17T04:45:38.4868359Z 
2026-05-17T04:45:40.0989696Z lint-better-auth-schema-sync: OK
2026-05-17T04:45:40.1121301Z 
2026-05-17T04:45:40.1122169Z === Lint: rate-limit-budgets ===
2026-05-17T04:45:40.1123017Z >>> pnpm lint:rate-limit-budgets
2026-05-17T04:45:40.4064217Z 
2026-05-17T04:45:40.4065215Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-17T04:45:40.4066052Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-17T04:45:40.4066431Z 
2026-05-17T04:45:40.4382540Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-17T04:45:40.4515500Z 
2026-05-17T04:45:40.4516437Z === Lint: no-clipboard-rce ===
2026-05-17T04:45:40.4517231Z >>> pnpm lint:no-clipboard-rce
2026-05-17T04:45:40.7456091Z 
2026-05-17T04:45:40.7457764Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-17T04:45:40.7472741Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-17T04:45:40.7473156Z 
2026-05-17T04:45:40.7827828Z lint-no-clipboard-rce: OK (23 file(s) clean)
2026-05-17T04:45:40.7961529Z 
2026-05-17T04:45:40.7962300Z === Lint: room-layout ===
2026-05-17T04:45:40.7965285Z >>> pnpm lint:room-layout
2026-05-17T04:45:41.0900335Z 
2026-05-17T04:45:41.0906881Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-17T04:45:41.0908457Z > node tools/scripts/lint-room-layout.mjs
2026-05-17T04:45:41.0909196Z 
2026-05-17T04:45:41.1284844Z lint-room-layout: OK
2026-05-17T04:45:41.1415343Z 
2026-05-17T04:45:41.1416070Z === ADR 0004 lint ===
2026-05-17T04:45:41.1418480Z >>> pnpm lint:adr:0004
2026-05-17T04:45:41.4345183Z 
2026-05-17T04:45:41.4355638Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-17T04:45:41.4357506Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-17T04:45:41.4358424Z 
2026-05-17T04:45:41.4669969Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-17T04:45:41.4796893Z 
2026-05-17T04:45:41.4797762Z === Drizzle: emit-check ===
2026-05-17T04:45:41.4798812Z >>> pnpm db:emit-check
2026-05-17T04:45:41.7814476Z 
2026-05-17T04:45:41.7845017Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-17T04:45:41.7870388Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-17T04:45:41.7872353Z 
2026-05-17T04:45:42.2172132Z No config path provided, using default 'drizzle.config.ts'
2026-05-17T04:45:42.2174125Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-17T04:45:42.6601280Z 8 tables
2026-05-17T04:45:42.6604740Z accounts 8 columns 1 indexes 0 fks
2026-05-17T04:45:42.6605950Z audit_log 6 columns 0 indexes 2 fks
2026-05-17T04:45:42.6606720Z characters 9 columns 0 indexes 1 fks
2026-05-17T04:45:42.6607903Z inventory_items 4 columns 0 indexes 1 fks
2026-05-17T04:45:42.6608859Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-17T04:45:42.6610197Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-17T04:45:42.6611259Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-17T04:45:42.6612470Z sessions 5 columns 0 indexes 1 fks
2026-05-17T04:45:42.6615231Z 
2026-05-17T04:45:42.6615884Z No schema changes, nothing to migrate 😴
2026-05-17T04:45:43.3171909Z 
2026-05-17T04:45:43.3184576Z === Drizzle: schema-sync ===
2026-05-17T04:45:43.3191221Z >>> pnpm lint:schema-sync
2026-05-17T04:45:43.6048975Z 
2026-05-17T04:45:43.6049741Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-17T04:45:43.6052617Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-17T04:45:43.6054974Z 
2026-05-17T04:45:43.6330120Z OK
2026-05-17T04:45:43.6460791Z 
2026-05-17T04:45:43.6461637Z === Drizzle: source-comments ===
2026-05-17T04:45:43.6462408Z >>> pnpm lint:source-comments
2026-05-17T04:45:43.9369769Z 
2026-05-17T04:45:43.9370901Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-17T04:45:43.9372060Z > pnpm -C packages/db run lint:source-comments
2026-05-17T04:45:43.9372681Z 
2026-05-17T04:45:44.2289518Z 
2026-05-17T04:45:44.2290810Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-17T04:45:44.2291929Z > node scripts/check-source-comments.mjs
2026-05-17T04:45:44.2292478Z 
2026-05-17T04:45:44.2600404Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-17T04:45:44.2823127Z 
2026-05-17T04:45:44.2824443Z === Workspace: test ===
2026-05-17T04:45:44.2825700Z >>> pnpm -r test
2026-05-17T04:45:44.5818836Z Scope: 5 of 6 workspace projects
2026-05-17T04:45:44.5871231Z packages/db test$ vitest run
2026-05-17T04:45:44.5879529Z packages/game-logic test$ vitest run
2026-05-17T04:45:45.0700740Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-17T04:45:45.0731275Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-17T04:45:45.4556199Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T04:45:45.6786444Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:45:45.8805808Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:45:46.0777564Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T04:45:46.1396160Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T04:45:46.3026743Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:45:46.3570563Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T04:45:46.5686277Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:45:46.7746319Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:45:46.9980842Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T04:45:47.0873572Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-17T04:45:47.1005586Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-17T04:45:47.1029041Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-17T04:45:47.1045114Z packages/db test: [2m   Start at [22m 04:45:45
2026-05-17T04:45:47.1055481Z packages/db test: [2m   Duration [22m 2.02s[2m (transform 209ms, setup 0ms, import 1.40s, tests 27ms, environment 1ms)[22m
2026-05-17T04:45:47.1284200Z packages/db test: Done
2026-05-17T04:45:47.1295583Z packages/protocol test$ vitest run
2026-05-17T04:45:47.2636499Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-17T04:45:47.4996609Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-17T04:45:47.6286825Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-17T04:45:47.7164403Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:45:47.9235060Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T04:45:47.9369118Z packages/game-logic test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-17T04:45:47.9425574Z packages/game-logic test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-17T04:45:47.9479303Z packages/game-logic test: [2m   Start at [22m 04:45:45
2026-05-17T04:45:47.9495666Z packages/game-logic test: [2m   Duration [22m 2.86s[2m (transform 239ms, setup 0ms, import 470ms, tests 105ms, environment 2ms)[22m
2026-05-17T04:45:48.0001239Z packages/game-logic test: Done
2026-05-17T04:45:48.0236898Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T04:45:48.2150312Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T04:45:48.3885558Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:45:48.5402152Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:45:48.5457146Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-17T04:45:48.5466231Z packages/protocol test: [2m      Tests [22m [1m[32m41 passed[39m[22m[90m (41)[39m
2026-05-17T04:45:48.5474711Z packages/protocol test: [2m   Start at [22m 04:45:47
2026-05-17T04:45:48.5476129Z packages/protocol test: [2m   Duration [22m 907ms[2m (transform 144ms, setup 0ms, import 278ms, tests 36ms, environment 0ms)[22m
2026-05-17T04:45:48.5766993Z packages/protocol test: Done
2026-05-17T04:45:48.5772657Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-17T04:45:48.5775349Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-17T04:45:49.1031350Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-17T04:45:49.1415345Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-17T04:45:50.2055613Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 67[2mms[22m[39m
2026-05-17T04:45:50.5797014Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 36[2mms[22m[39m
2026-05-17T04:45:50.6216446Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 96[2mms[22m[39m
2026-05-17T04:45:50.9680678Z apps/server test:  [32m✓[39m test/static-assets.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-17T04:45:51.2324430Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-17T04:45:51.4895633Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-17T04:45:51.8415365Z apps/server test: {"level":40,"time":1778993151837,"pid":3280,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T04:45:51.8469589Z apps/server test: {"level":40,"time":1778993151840,"pid":3280,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T04:45:51.8490118Z apps/server test: {"level":40,"time":1778993151841,"pid":3280,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T04:45:51.8492510Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T04:45:52.2624737Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-17T04:45:52.2635692Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-17T04:45:52.3610387Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 251[2mms[22m[39m
2026-05-17T04:45:52.7764370Z apps/server test: {"level":30,"time":1778993152775,"pid":3295,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-17T04:45:52.7808325Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 654[2mms[22m[39m
2026-05-17T04:45:52.7855753Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 527[2mms[22m[39m
2026-05-17T04:45:53.6556191Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 100[2mms[22m[39m
2026-05-17T04:45:53.6982564Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T04:45:53.6989488Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-igdAXB/rebno.db
2026-05-17T04:45:53.7017776Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T04:45:53.7656763Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T04:45:53.7677885Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T04:45:53.7703732Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T04:45:53.7721917Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T04:45:53.7745409Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T04:45:53.7748957Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T04:45:53.7753102Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T04:45:53.7755389Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:44:18
2026-05-17T04:45:53.7776604Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T04:45:53.7778818Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T04:45:53.7779496Z apps/server test: }
2026-05-17T04:45:53.7781370Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T04:45:53.7783022Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T04:45:53.7811817Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T04:45:53.7814198Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-afFRf7/rebno.db
2026-05-17T04:45:53.7818279Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T04:45:53.7820095Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-17T04:45:53.7856105Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T04:45:53.7891502Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T04:45:53.7894201Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T04:45:53.7898748Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T04:45:53.7914360Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T04:45:53.7918328Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T04:45:53.7921040Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T04:45:53.7947382Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:72:18
2026-05-17T04:45:53.7958469Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T04:45:53.7960679Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T04:45:53.7961696Z apps/server test: }
2026-05-17T04:45:53.7984276Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T04:45:53.8014828Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T04:45:53.8045685Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:45:53.8065106Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-mK1GRs/rebno.db
2026-05-17T04:45:53.8085335Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T04:45:53.8105892Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:45:53.8107886Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T04:45:53.8125854Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T04:45:53.8177511Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T04:45:53.8205451Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T04:45:53.8258309Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T04:45:53.8308889Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T04:45:53.8358908Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:91:19
2026-05-17T04:45:53.8385863Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T04:45:53.8387485Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T04:45:53.8394875Z apps/server test: }
2026-05-17T04:45:53.8396500Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:45:53.8397933Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T04:45:53.8399979Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:45:53.8401659Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-mK1GRs/rebno.db
2026-05-17T04:45:53.8403448Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T04:45:53.8405948Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:45:53.8407361Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T04:45:53.8408983Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:45:53.8410721Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T04:45:53.8412741Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T04:45:53.8415190Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T04:45:53.8417237Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T04:45:53.8419097Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T04:45:53.8420715Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T04:45:53.8422271Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:93:20
2026-05-17T04:45:53.8424883Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T04:45:53.8426478Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T04:45:53.8427321Z apps/server test: }
2026-05-17T04:45:53.8428673Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 139[2mms[22m[39m
2026-05-17T04:45:54.1256121Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-17T04:45:54.3482007Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T04:45:54.6235938Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-17T04:45:54.7768890Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 59[2mms[22m[39m
2026-05-17T04:45:54.8295727Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:45:55.6697525Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-17T04:45:55.6713426Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ multiple files { path: ['.env.local', '.env'] }
2026-05-17T04:45:55.6725071Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-17T04:45:55.9427230Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-17T04:45:56.3690170Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:45:56.3795707Z apps/server test: [2m Test Files [22m [1m[32m13 passed[39m[22m[90m (13)[39m
2026-05-17T04:45:56.3825113Z apps/server test: [2m      Tests [22m [1m[32m78 passed[39m[22m[90m (78)[39m
2026-05-17T04:45:56.3854761Z apps/server test: [2m   Start at [22m 04:45:49
2026-05-17T04:45:56.3880338Z apps/server test: [2m   Duration [22m 7.26s[2m (transform 497ms, setup 0ms, import 3.38s, tests 1.07s, environment 2ms)[22m
2026-05-17T04:45:56.4388443Z apps/server test: Done
2026-05-17T04:45:56.8014235Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T04:45:57.4987398Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T04:45:58.3138346Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-17T04:45:59.0591683Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 94[2mms[22m[39m
2026-05-17T04:45:59.8018894Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 86[2mms[22m[39m
2026-05-17T04:46:00.4931167Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-17T04:46:01.1741118Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-17T04:46:01.8552621Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-17T04:46:02.5396724Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-17T04:46:03.2577940Z apps/client test: [90mstderr[2m | src/__test__/background-renderer.test.ts[2m > [22m[2mBackgroundRenderer — wrap math (sim-tick pure state)[2m > [22m[2mD-64 round-4: dispose() survives a group whose .clear() throws (scene-shutdown race)
2026-05-17T04:46:03.2582638Z apps/client test: [22m[39mBackgroundRenderer.dispose: group.clear threw (likely scene-shutdown race) Cannot read properties of undefined (reading 'size')
2026-05-17T04:46:03.2612282Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 73[2mms[22m[39m
2026-05-17T04:46:03.9199759Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:04.5759123Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:05.2844393Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 70[2mms[22m[39m
2026-05-17T04:46:05.9349793Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:06.5902733Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:07.2519626Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T04:46:07.9026799Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-17T04:46:08.5474977Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:09.2216953Z apps/client test:  [32m✓[39m src/__test__/canvas-rect-tracker.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T04:46:09.8892145Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:10.5439430Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T04:46:11.2699396Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T04:46:11.9269450Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:12.5909548Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-17T04:46:13.2420786Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:13.8960141Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T04:46:14.5606788Z apps/client test:  [32m✓[39m src/__test__/integer-zoom.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:15.2172925Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T04:46:15.2392261Z apps/client test: [2m Test Files [22m [1m[32m33 passed[39m[22m[90m (33)[39m
2026-05-17T04:46:15.2401958Z apps/client test: [2m      Tests [22m [1m[32m241 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (245)[39m
2026-05-17T04:46:15.2403310Z apps/client test: [2m   Start at [22m 04:45:49
2026-05-17T04:46:15.2405224Z apps/client test: [2m   Duration [22m 26.09s[2m (transform 910ms, setup 62ms, collect 1.78s, tests 1.06s, environment 15.22s, prepare 2.80s)[22m
2026-05-17T04:46:15.3767412Z apps/client test: Done
2026-05-17T04:46:15.3852268Z 
2026-05-17T04:46:15.3852973Z verify-phase-4: OK (12 steps green)
2026-05-17T04:46:15.3974927Z 
2026-05-17T04:46:15.3979717Z === Workspace: typecheck ===
2026-05-17T04:46:15.3980377Z >>> pnpm -r typecheck
2026-05-17T04:46:15.6914175Z Scope: 5 of 6 workspace projects
2026-05-17T04:46:15.6964864Z packages/db typecheck$ tsc --noEmit
2026-05-17T04:46:15.6973331Z packages/game-logic typecheck$ tsc --noEmit
2026-05-17T04:46:18.1086387Z packages/game-logic typecheck: Done
2026-05-17T04:46:18.1100979Z packages/protocol typecheck$ tsc --noEmit
2026-05-17T04:46:20.3105556Z packages/db typecheck: Done
2026-05-17T04:46:21.5916409Z packages/protocol typecheck: Done
2026-05-17T04:46:21.5923415Z apps/client typecheck$ tsc --noEmit
2026-05-17T04:46:21.5931566Z apps/server typecheck$ tsc --noEmit
2026-05-17T04:46:33.6971448Z apps/client typecheck: Done
2026-05-17T04:46:34.1178195Z apps/server typecheck: Done
2026-05-17T04:46:34.1283307Z 
2026-05-17T04:46:34.1284448Z === Lint: deploy-stack ===
2026-05-17T04:46:34.1285138Z >>> pnpm lint:deploy-stack
2026-05-17T04:46:34.4163619Z 
2026-05-17T04:46:34.4165024Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-17T04:46:34.4165983Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-17T04:46:34.4166592Z 
2026-05-17T04:46:34.4511060Z lint-deploy-stack: OK
2026-05-17T04:46:34.4638035Z 
2026-05-17T04:46:34.4638806Z === Lint: deploy-stack test ===
2026-05-17T04:46:34.4639595Z >>> pnpm lint:deploy-stack:test
2026-05-17T04:46:34.7602246Z 
2026-05-17T04:46:34.7603475Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-17T04:46:34.7605120Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-17T04:46:34.7605742Z 
2026-05-17T04:46:34.8283067Z PASS: lint-deploy-stack green
2026-05-17T04:46:34.8419532Z 
2026-05-17T04:46:34.8420145Z === ADR 0005 lint ===
2026-05-17T04:46:34.8420879Z >>> pnpm lint:adr:0005
2026-05-17T04:46:35.1355269Z 
2026-05-17T04:46:35.1356350Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-17T04:46:35.1357704Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-17T04:46:35.1358574Z 
2026-05-17T04:46:35.1671351Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-17T04:46:35.1799077Z 
2026-05-17T04:46:35.1799796Z === ADR 0006 lint ===
2026-05-17T04:46:35.1800650Z >>> pnpm lint:adr:0006
2026-05-17T04:46:35.4718365Z 
2026-05-17T04:46:35.4719557Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-17T04:46:35.4722694Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-17T04:46:35.4724144Z 
2026-05-17T04:46:35.5031319Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-17T04:46:35.5149239Z 
2026-05-17T04:46:35.5149800Z === Workspace: test ===
2026-05-17T04:46:35.5151989Z >>> pnpm -r test
2026-05-17T04:46:35.8116661Z Scope: 5 of 6 workspace projects
2026-05-17T04:46:35.8168506Z packages/db test$ vitest run
2026-05-17T04:46:35.8176645Z packages/game-logic test$ vitest run
2026-05-17T04:46:36.3258309Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-17T04:46:36.3278019Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-17T04:46:36.7037829Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-17T04:46:36.9395135Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-17T04:46:37.1796055Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T04:46:37.2181889Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-17T04:46:37.4226971Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:37.6096659Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:37.8208243Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:38.0280321Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T04:46:38.0419123Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:38.2454639Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T04:46:38.2588883Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T04:46:38.2721944Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-17T04:46:38.2723404Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-17T04:46:38.2725926Z packages/db test: [2m   Start at [22m 04:46:36
2026-05-17T04:46:38.2727303Z packages/db test: [2m   Duration [22m 1.96s[2m (transform 185ms, setup 0ms, import 1.36s, tests 27ms, environment 0ms)[22m
2026-05-17T04:46:38.3053283Z packages/db test: Done
2026-05-17T04:46:38.3054891Z packages/protocol test$ vitest run
2026-05-17T04:46:38.4846488Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T04:46:38.6926064Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:38.8316180Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-17T04:46:38.8946171Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:39.1067205Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:39.1185349Z packages/game-logic test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-17T04:46:39.1212146Z packages/game-logic test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-17T04:46:39.1232643Z packages/game-logic test: [2m   Start at [22m 04:46:36
2026-05-17T04:46:39.1234795Z packages/game-logic test: [2m   Duration [22m 2.80s[2m (transform 234ms, setup 0ms, import 449ms, tests 101ms, environment 2ms)[22m
2026-05-17T04:46:39.1833455Z packages/game-logic test: Done
2026-05-17T04:46:39.2397613Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T04:46:39.4101565Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T04:46:39.5868809Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:39.7446045Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:46:39.7475301Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-17T04:46:39.7487303Z packages/protocol test: [2m      Tests [22m [1m[32m41 passed[39m[22m[90m (41)[39m
2026-05-17T04:46:39.7488688Z packages/protocol test: [2m   Start at [22m 04:46:38
2026-05-17T04:46:39.7490456Z packages/protocol test: [2m   Duration [22m 908ms[2m (transform 154ms, setup 0ms, import 276ms, tests 36ms, environment 0ms)[22m
2026-05-17T04:46:39.7825068Z packages/protocol test: Done
2026-05-17T04:46:39.7830290Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-17T04:46:39.7832538Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-17T04:46:40.3211874Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-17T04:46:40.3645899Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-17T04:46:41.2978111Z apps/server test: {"level":30,"time":1778993201295,"pid":4486,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-17T04:46:41.3030697Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 690[2mms[22m[39m
2026-05-17T04:46:41.3055032Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 529[2mms[22m[39m
2026-05-17T04:46:42.3106999Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-17T04:46:42.3142513Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-17T04:46:42.4076641Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 238[2mms[22m[39m
2026-05-17T04:46:42.4796973Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T04:46:42.4799431Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-kM2ngA/rebno.db
2026-05-17T04:46:42.4801071Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T04:46:42.5499970Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T04:46:42.5515501Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T04:46:42.5525938Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T04:46:42.5533042Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T04:46:42.5538441Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T04:46:42.5542243Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T04:46:42.5552155Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T04:46:42.5566065Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:44:18
2026-05-17T04:46:42.5585843Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T04:46:42.5589490Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T04:46:42.5614642Z apps/server test: }
2026-05-17T04:46:42.5626928Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T04:46:42.5629281Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T04:46:42.5631943Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T04:46:42.5705412Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-AsB9Tp/rebno.db
2026-05-17T04:46:42.5710065Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T04:46:42.5717573Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-17T04:46:42.5736373Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T04:46:42.5740547Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T04:46:42.5765433Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T04:46:42.5776842Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T04:46:42.5779678Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T04:46:42.5782291Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T04:46:42.5788328Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T04:46:42.5823459Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:72:18
2026-05-17T04:46:42.5855660Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T04:46:42.5884132Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T04:46:42.5885573Z apps/server test: }
2026-05-17T04:46:42.5887788Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T04:46:42.5891380Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T04:46:42.5896682Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:46:42.5925188Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-quefVb/rebno.db
2026-05-17T04:46:42.5935023Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T04:46:42.5955594Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:46:42.5979430Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T04:46:42.5981767Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T04:46:42.5986582Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T04:46:42.5989009Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T04:46:42.5990964Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T04:46:42.5992653Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T04:46:42.5994566Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:91:19
2026-05-17T04:46:42.5997157Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T04:46:42.5998720Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T04:46:42.5999415Z apps/server test: }
2026-05-17T04:46:42.6001192Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:46:42.6002764Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T04:46:42.6004827Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:46:42.6006689Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-quefVb/rebno.db
2026-05-17T04:46:42.6008108Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T04:46:42.6010229Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:46:42.6015035Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T04:46:42.6016902Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T04:46:42.6018980Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T04:46:42.6021325Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T04:46:42.6023654Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T04:46:42.6026166Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T04:46:42.6039465Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T04:46:42.6041647Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T04:46:42.6043200Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:93:20
2026-05-17T04:46:42.6045564Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T04:46:42.6046911Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T04:46:42.6047423Z apps/server test: }
2026-05-17T04:46:42.6048530Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 132[2mms[22m[39m
2026-05-17T04:46:42.9700628Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 105[2mms[22m[39m
2026-05-17T04:46:43.7796081Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 100[2mms[22m[39m
2026-05-17T04:46:43.8643619Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 46[2mms[22m[39m
2026-05-17T04:46:44.1611618Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-17T04:46:44.4739311Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-17T04:46:44.7193001Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-17T04:46:44.9193300Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 129[2mms[22m[39m
2026-05-17T04:46:44.9926496Z apps/server test: {"level":40,"time":1778993204980,"pid":4616,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T04:46:45.0131031Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-17T04:46:45.0133108Z apps/server test: {"level":40,"time":1778993204987,"pid":4616,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T04:46:45.0366653Z apps/server test: {"level":40,"time":1778993204988,"pid":4616,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T04:46:45.3232219Z apps/server test:  [32m✓[39m test/static-assets.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-17T04:46:45.5669976Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T04:46:45.7760359Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T04:46:46.1870118Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 177[2mms[22m[39m
2026-05-17T04:46:46.5822889Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-17T04:46:46.5842450Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ secrets for agents [www.dotenvx.com]
2026-05-17T04:46:46.6110189Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-17T04:46:47.2826709Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:47.3313531Z apps/client test: [90mstderr[2m | src/__test__/background-renderer.test.ts[2m > [22m[2mBackgroundRenderer — wrap math (sim-tick pure state)[2m > [22m[2mD-64 round-4: dispose() survives a group whose .clear() throws (scene-shutdown race)
2026-05-17T04:46:47.3317093Z apps/client test: [22m[39mBackgroundRenderer.dispose: group.clear threw (likely scene-shutdown race) Cannot read properties of undefined (reading 'size')
2026-05-17T04:46:47.3320638Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 128[2mms[22m[39m
2026-05-17T04:46:47.5298589Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:47.5300642Z apps/server test: [2m Test Files [22m [1m[32m13 passed[39m[22m[90m (13)[39m
2026-05-17T04:46:47.5302538Z apps/server test: [2m      Tests [22m [1m[32m78 passed[39m[22m[90m (78)[39m
2026-05-17T04:46:47.5304762Z apps/server test: [2m   Start at [22m 04:46:40
2026-05-17T04:46:47.5306781Z apps/server test: [2m   Duration [22m 7.18s[2m (transform 536ms, setup 0ms, import 3.37s, tests 1.09s, environment 2ms)[22m
2026-05-17T04:46:47.5704071Z apps/server test: Done
2026-05-17T04:46:48.2259120Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-17T04:46:48.9531058Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 76[2mms[22m[39m
2026-05-17T04:46:49.6641415Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 40[2mms[22m[39m
2026-05-17T04:46:50.3674703Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-17T04:46:51.0634402Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-17T04:46:51.7553460Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-17T04:46:52.4675260Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-17T04:46:53.1463647Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-17T04:46:53.8151496Z apps/client test:  [32m✓[39m src/__test__/canvas-rect-tracker.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T04:46:54.4864517Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T04:46:55.1654340Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T04:46:55.8291698Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-17T04:46:56.4838302Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:57.1458595Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:57.8126471Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:58.4970378Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T04:46:59.2286825Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T04:46:59.8931799Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T04:47:00.5719108Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:47:01.2574881Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:47:01.8996327Z apps/client test:  [32m✓[39m src/__test__/integer-zoom.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T04:47:02.5851596Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:47:03.2513761Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T04:47:03.9079436Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T04:47:04.5860574Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T04:47:05.2761535Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T04:47:05.9358650Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T04:47:06.6173051Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-17T04:47:06.6395633Z apps/client test: [2m Test Files [22m [1m[32m33 passed[39m[22m[90m (33)[39m
2026-05-17T04:47:06.6425316Z apps/client test: [2m      Tests [22m [1m[32m241 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (245)[39m
2026-05-17T04:47:06.6434832Z apps/client test: [2m   Start at [22m 04:46:40
2026-05-17T04:47:06.6457035Z apps/client test: [2m   Duration [22m 26.27s[2m (transform 876ms, setup 69ms, collect 1.73s, tests 1.20s, environment 15.16s, prepare 2.82s)[22m
2026-05-17T04:47:06.7762511Z apps/client test: Done
2026-05-17T04:47:06.7845720Z 
2026-05-17T04:47:06.7846441Z verify-phase-5: OK (7 steps green)
